Departamento de Ecologia IB-USP

Objetivos do curso

  • Introduzir o R como linguagem para análises de dados voltados para consultoria ambiental.

  • Revisar conceitos de estatística e as análises mais comuns na área ambiental.

  • Ao final, cada um deverá ser capaz de criar o próprio código para análises de seus dados.

  • Esse curso NÃO pretende:
    • substituir uma disciplina de estatística básica
    • aprofundar-se na programação em R ou outras ferramentas computacionais.

Programação do curso

Aula 1

  • Introdução ao R
  • Leitura e manipulação de dados

Aula 2

  • Análises exploratórias
  • Criação e edição de gráfico
  • Índices de diversidade
  • Curvas de rarefação

Aula 3

  • Inferência estatística
  • Modelos lineares
    • Regressão linear simples e múltipla
    • Análise de variância e covariância

Aula 4

  • Modelos lineares generalizados
  • Análises multivariadas:
    • PCA
    • NMDS

Organização do curso

Tempo, o maior problema!!

roteiros mais extensos e com conteúdo mais denso, PRECISAM ser feitos!
não desistir! prestar atenção ao código, deixar ele limpo.
fazendo as aulas e resolvendo problemas na hora

Aula 1

Apresentação

“Uma das coisas mais importantes que você pode fazer é dedicar um tempo para aprender uma linguagem de programação de verdade.

Aprender a programar é como aprender outro idioma: exige tempo e treinamento, e não há resultados práticos imediatos…


quem já conhece/domina alguma linguagem de programação?
lembrar que vamos errar bastante, e que vamos começar do mais básico

Apresentação

… mas se você supera essa primeira subida íngreme da curva de aprendizado, os ganhos são enormes.

Programar não vai apenas livrar você da camisa de força dos pacotes estatísticos, mas também irá aguçar suas habilidades analíticas e ampliar os horizontes de modelagem ecológica e estatística.”

Gotelli & Ellison, 2004. Principios de Estatística em Ecologia. Sunderland, Sinauer.

falar da minha experiência, dificuldade de aprendizado, e as coisas que faço até hoje, como sempre olhar o help e coódigos dos scripts antigos

O que é o R?

  • ambiente e linguagem de programação

"A chave para entender o R é que trata-se de uma linguagem. Uma linguagem para manipular objetos." Bill Venables

"A pergunta certa sobre uma análise em R não é se é possível fazê-la, e sim como fazê-la." Paulo Justiniano Ribeiro

  • linguagem de programação voltada para manipulação, análise e edição gráfica de dados
  • também chamado de programa

Filosofia do R: O código é tudo!

  • Programar com dados, os SEUS dados!

  • Reprodutibilidade

  • Software livre

há diferentes maneira de fazer a mesma coisa no R

Uma questão de costume

assim com é com outros programas, usar o R requer costume vantagem do R é que você mantém o caminho de tudo que fez - refazer análises!

Let´s !

cada vez mais, mais pessoas usam e buscam aprender o R
comunidade muito ativa, grande documentação online

Instalação

Estrutura básica da linguagem R

R no Windows

  • Interface gráfica Rgui
    • editor de texto
    • console
  • Simples, porém pouco prática

Rstudio IDE

precisa intalar o R e depois usar o Rstudio, clicando no icone tornar esse programa como padrão para arquivos .R

Configurações Rstudio

abrir o Rstudio e ir mostrando as coisas, as janelas, as facilidades. como criar um novo script

  • Interface mais amigável

  • Visão geral: os 4 painéis

  • Global Options:
    • encoding: UTF-8
    • soft-wrap code

O R como calculadora

2+5           #Soma
## [1] 7
30*7          #Multiplicação
## [1] 210
10/2          #Divisão
## [1] 5
10^2          #Potência
## [1] 100
sqrt(4)       #Raiz quadrada
## [1] 2
log(100,10)   #Log na base 10
## [1] 2
exp(1)        # n. euler elevado a 1
## [1] 2.718282
round(1.987645,2) #arredondamento
## [1] 1.99
abs(-1)       #número absoluto
## [1] 1
pi            #3,141618...
## [1] 3.141593

Precedência de operações e parênteses

2*4^3-1
## [1] 127
2*4^(3-1)
## [1] 32
(2*4)^3-1
## [1] 511
(2*4)^(3-1)
## [1] 64

lembrar da importância do parênteses! sempre haverá uma hora que nos esqueceremos dele!

Como criar um objeto

Objeto <- expressão

objeto <- 10+2  # Criando
objeto          # "Chamando"
## [1] 12
objeto*10   # x 10
## [1] 120
objeto      # ?
## [1] 12
objeto2 <- objeto*10   # novo
objeto2   #Agora sim salvou a operação
## [1] 120

Fazendo operações com objetos

a <- sqrt(4)
a
## [1] 2
b <- 5
a*b
## [1] 10
d <- c(2,4,6)
d*b
## [1] 10 20 30

explicar o qué é concatenar

Funções!

função(argumento1=valor1, argumento2=valor2, …)

plot(x=area, y=riqueza, log='xy')

plot(area, riqueza)

log(x=100, base=10)
log(100,10)

Obtendo ajuda!

#Abrindo página geral
help.start()

#Busca de termos no help
help.search("linear regression")
??"linear regression"

#Ajuda para funções específicas
help(mean)
?mean

#Argumentos da função
args(mean)

#Exemplo da função
example(mean)

mostrar no Rstudio onde fica o help, os locais de busca… também que quando se dá tab ele tenta completar a funcao e ja mostra o basico do help e argumentos –>

Instalando pacotes

  • Diretamente pelo console:
install.packages("vegan")
  • Pelo Rstudio ->

  • Carregando o pacote instalado*

library(vegan)

uma vez instalado o pacote não precisa mais instalar. mas toda vez que você abrir seu script novamente, terá de fazer o carregamento do pacote. geralmente library() fina no inicio do script, com todos os pacotes usados–>

Um erro comum

Funções também são objetos, se você digita uma função sem os parênteses, o R vai exibir o conteúdo da função

help
## function (topic, package = NULL, lib.loc = NULL, verbose = getOption("verbose"), 
##     try.all.packages = getOption("help.try.all.packages"), help_type = getOption("help_type")) 
## {
##     types <- c("text", "html", "pdf")
##     if (!missing(package)) 
##         if (is.name(y <- substitute(package))) 
##             package <- as.character(y)
##     if (missing(topic)) {
##         if (!is.null(package)) {
##             help_type <- if (!length(help_type)) 
##                 "text"
##             else match.arg(tolower(help_type), types)
##             if (interactive() && help_type == "html") {
##                 port <- tools::startDynamicHelp(NA)
##                 if (port <= 0L) 
##                   return(library(help = package, lib.loc = lib.loc, 
##                     character.only = TRUE))
##                 browser <- if (.Platform$GUI == "AQUA") {
##                   get("aqua.browser", envir = as.environment("tools:RGUI"))
##                 }
##                 else getOption("browser")
##                 browseURL(paste0("http://127.0.0.1:", port, "/library/", 
##                   package, "/html/00Index.html"), browser)
##                 return(invisible())
##             }
##             else return(library(help = package, lib.loc = lib.loc, 
##                 character.only = TRUE))
##         }
##         if (!is.null(lib.loc)) 
##             return(library(lib.loc = lib.loc))
##         topic <- "help"
##         package <- "utils"
##         lib.loc <- .Library
##     }
##     ischar <- tryCatch(is.character(topic) && length(topic) == 
##         1L, error = identity)
##     if (inherits(ischar, "error")) 
##         ischar <- FALSE
##     if (!ischar) {
##         reserved <- c("TRUE", "FALSE", "NULL", "Inf", "NaN", 
##             "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_")
##         stopic <- deparse(substitute(topic))
##         if (!is.name(substitute(topic)) && !stopic %in% reserved) 
##             stop("'topic' should be a name, length-one character vector or reserved word")
##         topic <- stopic
##     }
##     help_type <- if (!length(help_type)) 
##         "text"
##     else match.arg(tolower(help_type), types)
##     paths <- index.search(topic, find.package(if (is.null(package)) 
##         loadedNamespaces()
##     else package, lib.loc, verbose = verbose))
##     tried_all_packages <- FALSE
##     if (!length(paths) && is.logical(try.all.packages) && !is.na(try.all.packages) && 
##         try.all.packages && is.null(package) && is.null(lib.loc)) {
##         for (lib in .libPaths()) {
##             packages <- .packages(TRUE, lib)
##             packages <- packages[is.na(match(packages, .packages()))]
##             paths <- c(paths, index.search(topic, file.path(lib, 
##                 packages)))
##         }
##         paths <- paths[nzchar(paths)]
##         tried_all_packages <- TRUE
##     }
##     paths <- unique(paths)
##     attributes(paths) <- list(call = match.call(), topic = topic, 
##         tried_all_packages = tried_all_packages, type = help_type)
##     class(paths) <- "help_files_with_topic"
##     paths
## }
## <bytecode: 0x7fc16a3375c0>
## <environment: namespace:utils>

Linguagem orientada a objeto

area <- c(100,235,449, 98, 147, 214, 346, 89)
riqueza <- c(56,62,70,33,49,67,71,45)

summary(area)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    89.0    99.5   180.5   209.8   262.8   449.0
summary(riqueza)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   33.00   48.00   59.00   56.62   67.75   71.00

Como o R funciona?

Os objetos criados são mantidos na memória, até que sejam salvos.

Por default, todos os objetos são salvos em um único arquivo oculto no diretório de trabalho, chamado .RData.

Ao sair do programa, o R perguntas se deve salvar as alterações.

Como trabalhar com o R?

Separe cada projeto em um diretório (pasta)
- coloque os arquivos de dados
- inicie o R daquele diretório

Salve seus comandos em um arquivo
- salve o código (scritp) das análises no mesmo diretório.
- o arquivo será um arquivo texto com extensão .R ou .r

fazer um exemplo de criar uma pasta e um projeto dentro dela

Qual o diretório de trabalho atual?

getwd()

Mudando o diretório de trabalho

setwd( "/Users/melinatarituba/git-meme/consultR_curso")

No Rstudio*…

ir pro rstudio e mostrar como faz pra mudar o diretorio pelo menu e pela aba de files (more), como faz pra mandar um script pro console, ctrl+r

ls e rm: listar e remover objetos

ls()

[1] "area" "objeto" "riqueza"

rm(objeto)

ls()

[1] "area" "riqueza"

No Rstudio…

Classes de objetos

class(area)
## [1] "numeric"
x <- c("TRUE","FALSE","TRUE","TRUE")
class(x)
## [1] "character"
x<- as.logical(x)
class(x)
## [1] "logical"

Classe fatores

sexo <- rep(c("F","M"),each=9)
sexo
##  [1] "F" "F" "F" "F" "F" "F" "F" "F" "F" "M" "M" "M" "M" "M" "M" "M" "M"
## [18] "M"
class(sexo)
## [1] "character"
sexo <- as.factor(sexo) # mudando a classe
sexo
##  [1] F F F F F F F F F M M M M M M M M M
## Levels: F M

Níveis de um fator

levels(sexo)
## [1] "F" "M"

Contagem de observações

table(sexo)
## sexo
## F M 
## 9 9

Operações com um vetor

Todas as operações aplicadas a um vetor são aplicadas a cada um de seus elementos

a <- seq(from=0,to=8,by=2)
a
## [1] 0 2 4 6 8
2*a
## [1]  0  4  8 12 16
sqrt(a)
## [1] 0.000000 1.414214 2.000000 2.449490 2.828427

Operações entre vetores

Pareando os elementos

a
## [1] 0 2 4 6 8
b
## [1]  1 15 18  3  6
a+b
## [1]  1 17 22  9 14
a^(1/b)
## [1] 0.000000 1.047294 1.080060 1.817121 1.414214

Comprimento de vetores

length(a)
## [1] 5
length(b)
## [1] 5
length(a)/length(b)
## [1] 1

Funções estatísticas

sum(a)
## [1] 20
mean(a)
## [1] 4
var(a)
## [1] 10
min(a)
## [1] 0
max(a)
## [1] 8

Estas funções operam sobre TODO o vetor, e não elemento a elemento.

Funções estatísticas

a
## [1] 0 2 4 6 8
summary(a)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       2       4       4       6       8

Leitura e Manipulação de Dados

Importando dados

Salvar planilha excel como arquivos .txt ou .csv

avisar que existem alguns pacotes que importam xls xlsx

Leitura de arquivos texto

# arquivo txt com separação tabular
trapa <- read.table(file="trapalhoes.txt", header=T, sep="\n")

#arquivo csv com separação por , ou ;
trapa <- read.table(file="trapalhoes.csv", header=T, sep=";")
trapa
##   codinome nascimento estado vivo altura
## 1     didi       1936     CE    s   1.68
## 2     dede       1936     RJ    s   1.79
## 3   mussum       1941     RJ    n   1.81
## 4 zacarias       1934     MG    n   1.61
class(trapa); dim(trapa)
## [1] "data.frame"
## [1] 4 5

Leitura de dados

Cuidado com separador decimal!

read.table(..., dec = ".") 
read.table(..., dec=",")

Tipos de separador de colunas

read.table(..., sep=";") #csv Brasil
read.table(..., sep="\n") #tabulação
read.table(..., sep=",") #csv internacional

falar da vantagem em modificar o separador de decimal no computador

lembrar de sempre usar o HELP da função read.table, há vários argumentos importantes

SEMPRE verifique sua tabela depois de importar

Onde está o erro?

trapa2<-  read.table(file="trapalhoes.csv", header=T, sep=",")
trapa2
##   codinome.nascimento.estado.vivo.altura
## 1                    didi;1936;CE;s;1.68
## 2                    dede;1936;RJ;s;1.79
## 3                  mussum;1941;RJ;n;1.81
## 4                zacarias;1934;MG;n;1.61
dim(trapa2)
## [1] 4 1

Vendo a estrutura dos dados importados

dim(trapa)
## [1] 4 5
colnames(trapa)
## [1] "codinome"   "nascimento" "estado"     "vivo"       "altura"
rownames(trapa)
## [1] "1" "2" "3" "4"
str(trapa)
## 'data.frame':    4 obs. of  5 variables:
##  $ codinome  : Factor w/ 4 levels "dede","didi",..: 2 1 3 4
##  $ nascimento: int  1936 1936 1941 1934
##  $ estado    : Factor w/ 3 levels "CE","MG","RJ": 1 3 3 2
##  $ vivo      : Factor w/ 2 levels "n","s": 2 2 1 1
##  $ altura    : num  1.68 1.79 1.81 1.61

Colunas com caracteres foram convertidas para factor

Vendo a estrutura dos dados importados

summary(trapa)
##      codinome   nascimento   estado vivo      altura     
##  dede    :1   Min.   :1934   CE:1   n:2   Min.   :1.610  
##  didi    :1   1st Qu.:1936   MG:1   s:2   1st Qu.:1.663  
##  mussum  :1   Median :1936   RJ:2         Median :1.735  
##  zacarias:1   Mean   :1937                Mean   :1.722  
##               3rd Qu.:1937                3rd Qu.:1.795  
##               Max.   :1941                Max.   :1.810

Olhando a tabela de dados

head(trapa, n=2L)
##   codinome nascimento estado vivo altura
## 1     didi       1936     CE    s   1.68
## 2     dede       1936     RJ    s   1.79
tail(trapa, n=2L)
##   codinome nascimento estado vivo altura
## 3   mussum       1941     RJ    n   1.81
## 4 zacarias       1934     MG    n   1.61

Olhando a tabela de dados no Rstudio

Selecionando colunas no data frame $

trapa$codinome
## [1] didi     dede     mussum   zacarias
## Levels: dede didi mussum zacarias
trapa$altura
## [1] 1.68 1.79 1.81 1.61
trapa$estado
## [1] CE RJ RJ MG
## Levels: CE MG RJ

Criando nova coluna

Uso do $ para criar nova coluna

trapa$idade <- 2016 - trapa$nas
trapa
##   codinome nascimento estado vivo altura idade
## 1     didi       1936     CE    s   1.68    80
## 2     dede       1936     RJ    s   1.79    80
## 3   mussum       1941     RJ    n   1.81    75
## 4 zacarias       1934     MG    n   1.61    82

Cuidado para não escolher um nome de coluna já existente!

Criando uma nova coluna a partir de outra

Criando uma coluna do logarítmo de uma variável

trapa$log.alt <- log(trapa$alt)
trapa
##   codinome nascimento estado vivo altura idade   log.alt
## 1     didi       1936     CE    s   1.68    80 0.5187938
## 2     dede       1936     RJ    s   1.79    80 0.5822156
## 3   mussum       1941     RJ    n   1.81    75 0.5933268
## 4 zacarias       1934     MG    n   1.61    82 0.4762342

Substituindo valores nas colunas

trapa$vivo
## [1] s s n n
## Levels: n s
trapa$vivo <- c("TRUE","TRUE", "FALSE", "FALSE")
trapa
##   codinome nascimento estado  vivo altura idade   log.alt
## 1     didi       1936     CE  TRUE   1.68    80 0.5187938
## 2     dede       1936     RJ  TRUE   1.79    80 0.5822156
## 3   mussum       1941     RJ FALSE   1.81    75 0.5933268
## 4 zacarias       1934     MG FALSE   1.61    82 0.4762342

Operações com vetores lógicos e indexação

Operações com vetores lógicos

">" maior que

"<" menor que

"==" igual a

"!=" diferente de

"&" e

"|" ou

Operações com vetores lógicos

altura; sexo
## [1] 1.85 1.78 1.92 1.63 1.81 1.55
## [1] "M" "M" "M" "F" "F" "F"
altura > 1.80
## [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE
machos.altos <- altura > 1.80 & sexo =="M"
machos.altos
## [1]  TRUE FALSE  TRUE FALSE FALSE FALSE
lembrar que o == são 2 e não 1

Operações com vetores lógicos

notas
##  [1]  6.0  5.1  6.8  2.8  6.1  9.0  4.3 10.4  6.0  7.9  8.9  6.8  9.8  4.6
## [15] 11.3  8.0  6.7  4.5

Quantos aprovados?

notas >= 5
##  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
## [12]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
sum(notas >= 5)
## [1] 14

Vetores lógicos em matrizes

ilhas
##      ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8
## sp 1      3      2      2      3      4      1      1      6
## sp 2      4      2      3      3      6      5      0      5
## sp 3      0      0      4      5      5      0      2      1
## sp 4      1      0      3      4      0      3      2      3
## sp 5      6      4      4      3      6      1      6      6
ilhas.vf = ilhas > 0  ; ilhas.vf
##      ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8
## sp 1   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE
## sp 2   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE  FALSE   TRUE
## sp 3  FALSE  FALSE   TRUE   TRUE   TRUE  FALSE   TRUE   TRUE
## sp 4   TRUE  FALSE   TRUE   TRUE  FALSE   TRUE   TRUE   TRUE
## sp 5   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE

Extraindo informação da matriz

ilhas.vf
##      ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8
## sp 1   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE
## sp 2   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE  FALSE   TRUE
## sp 3  FALSE  FALSE   TRUE   TRUE   TRUE  FALSE   TRUE   TRUE
## sp 4   TRUE  FALSE   TRUE   TRUE  FALSE   TRUE   TRUE   TRUE
## sp 5   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE

Quantas espécies por ilha?

apply(X=ilhas.vf, MARGIN=2,FUN=sum )
## ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8 
##      4      3      5      5      4      4      4      5

Extraindo informação da matriz

Quantas ilhas por espécie?

apply(X=ilhas.vf, MARGIN=1,FUN=sum )
## sp 1 sp 2 sp 3 sp 4 sp 5 
##    8    7    5    6    8

Indexação de vetores usando [ ] para isolar elementos

a
## [1] 0 2 4 6 8
a[1]
## [1] 0
a[5]
## [1] 8
a[1:2]
## [1] 0 2
a[c(1,3,5)]
## [1] 0 4 8

Indexação [linha,coluna] em data frames

dat
##   sexo altura peso
## 1    M   1.85   80
## 2    M   1.78  100
## 3    M   1.92  115
## 4    F   1.63   70
## 5    F   1.81   65
## 6    F   1.55   50
dat[1,]
##   sexo altura peso
## 1    M   1.85   80
dat[,2]
## [1] 1.85 1.78 1.92 1.63 1.81 1.55
dat[1,1]
## [1] M
## Levels: F M
dat[3,3]
## [1] 115

A mesma lógica se aplica em matrizes!

Indexação operações lógicas em data frames

dat
##   sexo altura peso
## 1    M   1.85   80
## 2    M   1.78  100
## 3    M   1.92  115
## 4    F   1.63   70
## 5    F   1.81   65
## 6    F   1.55   50
dat$peso
## [1]  80 100 115  70  65  50
dat$peso[dat$sexo == "M"]
## [1]  80 100 115
dat$peso[dat$sexo == "M" & dat$altura > 1.80]
## [1]  80 115

ficar um tempo nessa, mostrar o script e os resultados de novo no R, ter certeza que aprenderam

Exportando dados write.table()

write.table(trapa,"trapa.csv")

write.csv(trapa,"trapa.csv")

Erros mais comuns no R

  • Leia atentamente as mensagens de erro
  • com o tempo você vai começar a se acostumar com as mais comuns e saber logo o problema
  • Se não entender, use o google!

Objeto não encontrado

dadoz
ls()
## [1] "dados"
dados
## [1] 23 10 45

Função não encontrada

dados <- read.tabe("sps.csv", header=T,sep=";")
dados <- read.table("sps.csv", header=T,sep=";")
library(sciplot)
lineplot.CI(dados$cor, dados$peso)

Esquecendo de fechar parênteses

Se você não fecha algum dos parênteses do seu comando, vai aparecer um sinal de + no console.
- Feche os parênteses ou
- Aperte ESC

plot(dados$cor,dados$peso

Símbolos inesperados

  • Esqueceu a vírgula separando os argumentos?
  • Colocou espaço entre os nomes de um objeto?
plot(dadoscor dados$peso)

aula pratica
aula.pratica

colocar as imagens de mensagenbs de erro desse slide

Os 10 mandamentos do R


1º Usarás o R em tuas análises e manipulação de teus dados
2º Nunca digitarás o código no console;
3º Salvarás seus scripts e não se preocuparás com o .RData;
4º Sempre concatenarás;
5º Jamais esquecerás dos parênteses das funções;
6º Conferirás o diretório de trabalho e os dados antes de enlouqueceres;
7º Usarás o help antes de perguntares e não culparás o R por teus erros;
8º Não esmorecerás e jamais amaldiçoarás o R por tuas faltas de vírgulas;
9º Lembrarás das aspas dos caracteres;
10º Não cobiçarás e aperfeiçoarás os códigos alheios e nunca ocultarás o código e a autoria original;

Alexandre Adalardo

mostrar os livros
falar das referências e locais de estudo no tutorial!